﻿package com.google.code.p.ivans.entities;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.google.code.p.ivans.myexceptions.EntityNotFoundException;
import com.google.code.p.ivans.myexceptions.NoLinksException;

public class WaitersOrdersLinks implements Serializable{
	
	private static  final long serialVersionUID = 7751135597915887844L;

	public   ArrayList<WaitersOrders> links = new ArrayList<WaitersOrders>();;
	
	public WaitersOrdersLinks() {
		links = new ArrayList<WaitersOrders>();
	}		
	
	public void addLink(long waiterId, long orderId) {
		//если в связях уже есть связь waiterId<->OrderId, 
		//то нет смысла дублировать
		for(WaitersOrders current : links) {
			if(current.getOrderID() == orderId &&
			   current.getWaiterID() == waiterId)
				return;
		}
		
		links.add(new WaitersOrders(waiterId, orderId));
	}
	
	public void removeLink(long linkId) throws EntityNotFoundException {
		
		for(WaitersOrders link : links) {
			if(link.getID() == linkId){
				links.remove(link);
				return;
			}				
		}
		
		throw new EntityNotFoundException();
	}
	
	public List<Order> getOrdersByWaiterId(long waiterId) throws EntityNotFoundException, FileNotFoundException, ClassNotFoundException, IOException, NoLinksException {
		List<Order> orders = new ArrayList<Order>();
		
		if(links.size() == 0)
			throw new NoLinksException();
		
		for(WaitersOrders link : links) {
			if(link.getWaiterID() == waiterId){
				Order order;
				try{
					order = Storage.getInstance().searchOrderByID(link.getOrderID());
					orders.add(order);
				}
				catch(EntityNotFoundException ignore){
					/*не нашли заказ по данному официанту - ну и  ладно, идем дальше*/					
				}		
			}
		}
		
		if(orders.size() != 0)
			return orders;
		//если у данного официанта не нашлось заказов, бросаем
		throw new EntityNotFoundException();
	}
	
	public List<Waiter> getWaitersByOrderId(long orderId) throws EntityNotFoundException, NoLinksException {
		List<Waiter> waiters = new ArrayList<Waiter>();
		
		if(links.size() == 0)
			throw new NoLinksException();
		
		for(WaitersOrders link : links) {
			if(link.getOrderID() == orderId){
				Waiter waiter;
				try{
					waiter = Storage.getInstance().searchWaiterByID(link.getWaiterID());
					waiters.add(waiter);
				}
				catch(EntityNotFoundException ignore) {
					/*не нашли официанта по данному заказу - ну и  ладно, идем дальше*/
				}
				catch (IOException e) {					
					/*не нашли официанта по данному заказу - ну и  ладно, идем дальше*/
				}		
			}
		}
		
		if(waiters.size() != 0)
			return waiters;
		
		//если у данного заказа не нашлось официантов, бросаем
		throw new EntityNotFoundException();
	}	

	
	public void setLinks(ArrayList<WaitersOrders> newLinks) {
		links = newLinks;
	}
	
	public void removeAllLinksByWaiterId(long waiterId) {
		for(WaitersOrders link : links) {
			if(link.getWaiterID() == waiterId){
				links.remove(link);				
			}				
		}
	}
	
	public void removeAllLinksByOrderId(long orderId) {
		for(WaitersOrders link : links) {
			if(link.getWaiterID() == orderId){
				links.remove(link);				
			}				
		}
	}
	
	public WaitersOrders getLink(long linkId) throws EntityNotFoundException {
		for(WaitersOrders wo : links) {
			if(wo.getID() == linkId)
				return wo;
		}
		//дошли до конца и не нашли->бросаем EntityNotFoundException
		throw new EntityNotFoundException();
	}
	
	public int getSize() {
		return links.size();
	}
}
